package com.bw.gmall.realtime.Day0919;

import java.sql.*;
import java.util.Properties;
import java.util.logging.*;

/**
 * ClickHouse数据库操作工具类
 * 提供查询表内容并输出到控制台的功能
 */
public class ClickHouseUtil {
    // ClickHouse JDBC驱动类名
    private static final String DRIVER_CLASS = "ru.yandex.clickhouse.ClickHouseDriver";
    private static final Integer PORT = 8123;
    private static final String HOST = "hadoop102";

    // 数据库连接信息，实际使用时请替换为你的配置
    private String host;
    private int port;
    private String database;
    private String username;
    private String password;

    private Connection connection;

    /**
     * 构造方法，初始化数据库连接信息
     * @param host 数据库主机地址
     * @param port 数据库端口
     * @param database 数据库名称
     * @param username 用户名
     * @param password 密码
     */
    public ClickHouseUtil(String host, int port, String database, String username, String password) {
        this.host = host;
        this.port = port;
        this.database = database;
        this.username = username;
        this.password = password;
    }

    // 日志记录器
    private static final Logger logger = Logger.getLogger(ClickHouseUtil.class.getName());

    /**
     * 静态初始化块，配置日志系统只输出ERROR级别
     */
    static {
        // 设置日志级别为ERROR
        logger.setLevel(Level.SEVERE);

        // 移除默认处理器，避免重复输出
        for (Handler handler : logger.getHandlers()) {
            logger.removeHandler(handler);
        }

        // 添加自定义控制台处理器，只处理ERROR级别
        ConsoleHandler consoleHandler = new ConsoleHandler();
        consoleHandler.setLevel(Level.SEVERE);

        // 简单的日志格式
        SimpleFormatter formatter = new SimpleFormatter() {
            @Override
            public String format(LogRecord record) {
                return "[" + record.getLevel() + "] " + record.getMessage() + "\n";
            }
        };
        consoleHandler.setFormatter(formatter);

        logger.addHandler(consoleHandler);
    }

    /**
     * 建立数据库连接
     * @return 是否连接成功
     */
    public boolean connect() {
        try {
            // 加载驱动
            Class.forName(DRIVER_CLASS);

            // 构建连接URL
            String url = String.format("jdbc:clickhouse://%s:%d/%s", HOST, PORT, database); // jdbc:clickhouse://hadoop102:8123/gmall

            // 设置连接属性
            Properties properties = new Properties();
            properties.setProperty("user", username);
            properties.setProperty("password", password);

            // 建立连接
            connection = DriverManager.getConnection(url, properties);
            System.out.println("成功连接到ClickHouse数据库");
            return true;
        } catch (ClassNotFoundException e) {
            System.err.println("找不到ClickHouse JDBC驱动，请检查依赖");
            e.printStackTrace();
        } catch (SQLException e) {
            System.err.println("连接ClickHouse数据库失败");
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 执行查询语句并将结果输出到控制台
     * @param querySql 查询SQL语句
     */
    public void queryAndPrint(String querySql) {
        if (connection == null) {
            System.err.println("数据库连接未建立，请先调用connect()方法");
            return;
        }

        Statement statement = null;
        ResultSet resultSet = null;

        try {
            // 创建Statement对象
            statement = connection.createStatement();
            System.out.println("执行查询: " + querySql);

            // 执行查询
            long startTime = System.currentTimeMillis();
            resultSet = statement.executeQuery(querySql);
            long endTime = System.currentTimeMillis();
            System.out.println("查询执行完成，耗时: " + (endTime - startTime) + "ms");

            // 获取结果集元数据
            ResultSetMetaData metaData = resultSet.getMetaData();
            int columnCount = metaData.getColumnCount();

            // 打印列名
            for (int i = 1; i <= columnCount; i++) {
                System.out.printf("%-20s", metaData.getColumnName(i),"|");
            }
            System.out.println();

            // 打印分隔线
            for (int i = 1; i <= columnCount; i++) {
                System.out.printf("%-20s", "--------------------");
            }
            System.out.println();

            // 打印数据行
            int rowCount = 0;
            while (resultSet.next()) {
                rowCount++;
                for (int i = 1; i <= columnCount; i++) {
                    String value = resultSet.getString(i);
                    System.out.printf("%-20s", value != null ? value : "null","|");
                }
                System.out.println();

                // 可以根据需要限制输出行数，防止数据量过大
                // if (rowCount >= 1000) {
                //     System.out.println("已输出1000行，后续数据将被忽略");
                //     break;
                // }
            }

            System.out.println("\n查询完成，共返回 " + rowCount + " 行数据");

        } catch (SQLException e) {
            System.err.println("执行查询失败");
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (statement != null) {
                    statement.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 关闭数据库连接
     */
    public void close() {
        if (connection != null) {
            try {
                connection.close();
                System.out.println("已关闭ClickHouse数据库连接");
            } catch (SQLException e) {
                System.err.println("关闭数据库连接失败");
                e.printStackTrace();
            }
        }
    }

    /**
     * 示例用法
     */
    public static void main(String[] args) {
        // 初始化工具类，替换为你的数据库信息
        ClickHouseUtil clickHouseUtil = new ClickHouseUtil(
                "localhost",  // 主机地址
                8123,         // 端口，默认8123
                "default",    // 数据库名
                "default",    // 用户名
                ""            // 密码，默认可能为空
        );

        // 建立连接
        if (clickHouseUtil.connect()) {
            // 示例1：查询表结构
            clickHouseUtil.queryAndPrint("DESCRIBE TABLE system.tables");

            // 示例2：查询表数据（全表查询）
            // clickHouseUtil.queryAndPrint("SELECT * FROM your_table_name");

            // 关闭连接
            clickHouseUtil.close();
        }
    }
}
